//题目:
// 给你一个字符串 s ，找出其中最长的回文子序列，并返回该序列的长度。
// 子序列定义为：不改变剩余字符顺序的情况下，删除某些字符或者不删除任何字符形成的一个序列。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int longestPalindromeSubseq(string s) 
    {
        int n=s.size();
        //1.创建dp表————dp[i][j]表示：以s[i]为起点，s[j]为终点 的子序列是否回文，若是，则表示其长度
        vector<vector<int>> dp(n,vector<int>(n));
        //2.初始化 ———— 无
        //3.填表 ———— 从右向左
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    if(i==j) dp[i][j]=1;
                    else if(i+1==j) dp[i][j]=2;
                    else dp[i][j]=dp[i+1][j-1]+2;
                }
                else
                    dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
            }
        }
        //4.确定返回值
        return dp[0][n-1];
    }
};